package poo.biblioteca.bd;

import biblioteca.entidades.Lector;
import biblioteca.entidades.TipoLector;
import biblioteca.excepciones.ExcepcionDeBD;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;

public class BDLectores extends BDBase {

    public void registrarTipoLector(TipoLector nuevoTipoLector) throws ExcepcionDeBD {
        dbm = DBManager.getInstancia();
        try (Connection conn = dbm.getConnection()) {
            PreparedStatement pst = conn.prepareStatement(
                    "INSERT INTO TIPOLECTOR (NOMBRETIPOLECTOR, "
                    + "NUMERODIASPRESTAMO, "
                    + "NUMEROMAXPRESTAMOSSIMULTANEOS) "
                    + "VALUES (?,?,?)");
            pst.setString(1, nuevoTipoLector.getNombreTipoLector());
            pst.setInt(2, nuevoTipoLector.getNumeroDiasPrestamo());
            pst.setInt(3, nuevoTipoLector.getNumeroMaxPrestamosSimultaneos());
            pst.executeUpdate();
        } catch (SQLException ex) {
            throw new ExcepcionDeBD("No se pudo registrar el nuevo "
                    + "Tipo de Lector en la Base de Datos");
        }
    }

    public ArrayList<TipoLector> leerTipoDeLectores() throws ExcepcionDeBD {
        dbm = DBManager.getInstancia();
        ArrayList<TipoLector> tiposDeLector = new ArrayList<>();
        try (Connection conn = dbm.getConnection()) {

            PreparedStatement pst = conn.prepareStatement(
                    "SELECT IDTIPOLECTOR, NOMBRETIPOLECTOR, "
                    + "NUMERODIASPRESTAMO, NUMEROMAXPRESTAMOSSIMULTANEOS "
                    + "FROM TIPOLECTOR");
            ResultSet rs = pst.executeQuery();
            TipoLector tipo = null;
            while (rs.next()) {
                tipo = new TipoLector(rs.getInt("IDTIPOLECTOR"),
                        rs.getString("NOMBRETIPOLECTOR"),
                        rs.getInt("NUMERODIASPRESTAMO"),
                        rs.getInt("NUMEROMAXPRESTAMOSSIMULTANEOS"));
                tiposDeLector.add(tipo);
            }
        } catch (SQLException ex) {
            throw new ExcepcionDeBD("No se pudo leer los tipos de lector de la Base de Datos");
        }
        return tiposDeLector;

    }

    public void registrarLector(Lector nuevoLector) throws ExcepcionDeBD {
        dbm = DBManager.getInstancia();
        try (Connection conn = dbm.getConnection()) {
            PreparedStatement pst = null;

            if (nuevoLector.getTipoLector().getNombreTipoLector().contains("Alumno")) {
                pst = conn.prepareStatement(
                        "INSERT INTO LECTOR (NOMBRES, APELLIDOS, "
                        + "CODIGOALUMNO, IDTIPOLECTOR, DNI, EMAIL, TELEFONO) "
                        + "VALUES (?, ?, ?, ?, ?, ?, ?)");
                pst.setString(1, nuevoLector.getNombres());
                pst.setString(2, nuevoLector.getApellidos());
                pst.setString(3, nuevoLector.getCodigoAlumno());
                pst.setInt(4, nuevoLector.getTipoLector().getIdTipoLector());
                pst.setString(5, nuevoLector.getDni());
                pst.setString(6, nuevoLector.getEmail());
                pst.setString(7, nuevoLector.getTelefono());

            } else {

                pst = conn.prepareStatement(
                        "INSERT INTO LECTOR (NOMBRES, APELLIDOS, "
                        + "IDTIPOLECTOR, DNI, EMAIL, TELEFONO) "
                        + "VALUES (?, ?, ?, ?, ?, ?)");
                pst.setString(1, nuevoLector.getNombres());
                pst.setString(2, nuevoLector.getApellidos());
                pst.setInt(3, nuevoLector.getTipoLector().getIdTipoLector());
                pst.setString(4, nuevoLector.getDni());
                pst.setString(5, nuevoLector.getEmail());
                pst.setString(6, nuevoLector.getTelefono());

            }
            pst.executeUpdate();
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
            throw new ExcepcionDeBD("No se pudo registrar el nuevo "
                    + "Tipo de Lector en la Base de Datos");
        }
    }

    public ArrayList<Lector> buscarLectoresPorApellido(String apellidos) throws ExcepcionDeBD {
        dbm = DBManager.getInstancia();
        ArrayList<Lector> lectores = new ArrayList<>();
        try (Connection conn = dbm.getConnection()) {

            PreparedStatement pst = conn.prepareStatement(
                    "SELECT IDLECTOR, NOMBRES, APELLIDOS, CODIGOALUMNO, IDTIPOLECTOR, "
                    + "INHABILITADOHASTA, DNI, EMAIL, TELEFONO "
                    + "FROM LECTOR WHERE APELLIDOS LIKE ?");
            pst.setString(1, "%" + apellidos + "%");
            ResultSet rs = pst.executeQuery();
            Lector lector = null;
            while (rs.next()) {
                Date inhabilitadoHasta = rs.getDate("INHABILITADOHASTA");

                GregorianCalendar fechaInh = null;
                if (inhabilitadoHasta != null) {
                    fechaInh = new GregorianCalendar();
                    fechaInh.setTime(inhabilitadoHasta);
                }

                lector = new Lector(rs.getInt("IDLECTOR"), rs.getString("NOMBRES"), rs.getString("APELLIDOS"),
                        rs.getString("CODIGOALUMNO"), buscarTipoLectorPorId(rs.getInt("IDTIPOLECTOR")),
                        fechaInh,
                        rs.getString("DNI"), rs.getString("EMAIL"), rs.getString("TELEFONO"));

                lectores.add(lector);
            }
        } catch (SQLException ex) {
            throw new ExcepcionDeBD("No se pudo leer los Lectores de la Base de Datos", ex);
        }

        return lectores;
    }

    public TipoLector buscarTipoLectorPorId(int idTipoLector) throws ExcepcionDeBD {
        dbm = DBManager.getInstancia();
        TipoLector tipoLectorBuscado = null;

        try (Connection conn = dbm.getConnection()) {

            PreparedStatement pst = conn.prepareStatement(
                    "SELECT IDTIPOLECTOR, NOMBRETIPOLECTOR, "
                    + "NUMERODIASPRESTAMO, NUMEROMAXPRESTAMOSSIMULTANEOS "
                    + "FROM TIPOLECTOR WHERE IDTIPOLECTOR = ?");
            pst.setInt(1, idTipoLector);
            ResultSet rs = pst.executeQuery();

            while (rs.next()) {
                tipoLectorBuscado = new TipoLector(rs.getInt("IDTIPOLECTOR"),
                        rs.getString("NOMBRETIPOLECTOR"),
                        rs.getInt("NUMERODIASPRESTAMO"),
                        rs.getInt("NUMEROMAXPRESTAMOSSIMULTANEOS"));
            }
        } catch (SQLException ex) {
            throw new ExcepcionDeBD("No se pudo leer los tipos de lector de la Base de Datos");
        }
        return tipoLectorBuscado;


    }

    public ArrayList<Lector> buscarLectoresHabilitadosPorApellido(String apellidos) throws ExcepcionDeBD {
        dbm = DBManager.getInstancia();
        ArrayList<Lector> lectores = new ArrayList<>();
        try (Connection conn = dbm.getConnection()) {

            PreparedStatement pst = conn.prepareStatement(
                    "SELECT IDLECTOR, NOMBRES, APELLIDOS, CODIGOALUMNO, IDTIPOLECTOR, "
                    + "INHABILITADOHASTA, DNI, EMAIL, TELEFONO "
                    + "FROM LECTOR WHERE APELLIDOS LIKE ?");
            pst.setString(1, "%" + apellidos + "%");
            ResultSet rs = pst.executeQuery();
            Lector lector = null;
            while (rs.next()) {
                Date inhabilitadoHasta = rs.getDate("INHABILITADOHASTA");

                if (inhabilitadoHasta == null) {
                    lector = new Lector(rs.getInt("IDLECTOR"), rs.getString("NOMBRES"), rs.getString("APELLIDOS"),
                            rs.getString("CODIGOALUMNO"), buscarTipoLectorPorId(rs.getInt("IDTIPOLECTOR")),
                            null,
                            rs.getString("DNI"), rs.getString("EMAIL"), rs.getString("TELEFONO"));

                    lectores.add(lector);
                }


            }
        } catch (SQLException ex) {
            throw new ExcepcionDeBD("No se pudo leer los Lectores de la Base de Datos", ex);
        }

        return lectores;
    }
    
    public int numeroPrestamosSinDevolverDeLector (Lector lector) throws ExcepcionDeBD {
        
        dbm = DBManager.getInstancia();
        int numeroPrestamos = 0;
        
        try (Connection conn = dbm.getConnection()) {

            PreparedStatement pst = conn.prepareStatement(
                    "SELECT COUNT(*) FROM LECTOR INNER JOIN PRESTAMO ON LECTOR.`idLector`=PRESTAMO.`idLector` "
                    + "WHERE LECTOR.IDLECTOR = ? AND PRESTAMO.`fechaEfectivaDevolucion` IS NULL");
            pst.setInt(1, lector.getIdLector());
            ResultSet rs = pst.executeQuery();
            
            while (rs.next()) {
                numeroPrestamos = rs.getInt(1);

            }
        } catch (SQLException ex) {
            throw new ExcepcionDeBD("No se pudo leer el numero de Préstamos de la Base de Datos", ex);
        }

        return numeroPrestamos;
    }
}
